//事件监听器 事件总线 (编程思想 订阅发布)
const EventListener = function(){
  let obj = {};
  //注册事件名和事件方法
  // let Register = {}; //里面存放的内容是 以自定义事件名为 key 以用户传递过来的事件回调函数当作value

  //存储数据 --> {}可以通过键值对的方式存贮  []合适与存储同类型的数据

  let a = {}; //里面存放的内容是 以自定义事件名为 key 以用户传递过来的事件回调函数当作value

  //当前a的内容 
// a = {
//   changeA:[function(data){console.log(data)},function(sum){console.log(sum+1)}],
//   changeB:[function(sum){console.log(sum+1)}]
// }

  //在bus上监听一个"changeA"事件, 当changeA事件触发的时候 去执行 回调函数
  //1. wx.bus.on("changeA", function(data){console.log(data)})
  //2. wx.bus.on("changeA", function(sum){console.log(sum+1)})
    //3. wx.bus.on("changeB", function(sum){console.log(sum+1)})
  obj.on = function(name, method){//"changeA"
         //如果当前事件池中存在name这个属性名,表示这个事件池已经被创建过了 并且他的数据类型是个Array
         if(a.hasOwnProperty(name)){
          a[name].push(method)
         }else{
           //如果当前事件吃中没有name这个属性存在,则表示是第一次添加这个属性,需要给这个属性初始化为数组,并且加入数组第一项
           a[name] = [method]
         }
  };
  
  // wx.bus.on("changeA", function(data, msg){
  //   console.log(data, msg)
  // })
  // wx.bus.emit("changeA", "1234", "你好我是emit")
  obj.emit = function(name){
    // arguments 方法的参数集合 ==> ["changeA", "1234", "你好我是emit"]
    let arg = []; //= ["1234", "你好我是emit"]
    for(let i = 1;i<arguments.length;i++){
      arg.push(arguments[i])
    }
    // a[name] = [function(data){console.log(data)},function(sum){console.log(sum+1)}]
    let methods = a[name];
    methods.forEach((method)=>{
        //this????
        // method(...arg)
      method.apply(this, arg)
    })
  };
  //移除监听
  
  // wx.bus.off("changeA", function(sum){console.log(sum+1)})
  obj.off = function(name, method){
    //当用户输入wx.bus.off("changeA") 移除所有监听事件
    if(!method){
      a[name] = [];
      return
    }

    //先从事件池中获取到当前name事件所对应的所有回调函数 
    let methods = a[name]; //[function(data){console.log(data)},function(sum){console.log(sum+1)}],
    for(let i=0;i<methods.length;i++){
      let handler = methods[i];
      if(method.toString() === handler.toString()){
        methods.splice(i, 1)
      }
    }
  }
  //destroy 销毁所有的事件监听
  // obj.destroy()
  obj.destroy = function(){
    a = {}
  }
  return obj;
}
export default EventListener